import axios from 'axios'
import {Message} from 'element-ui'
import qs from 'qs'
import {getToken} from '@/utils/auth'
import store from '@/store'

const CancelToken = axios.CancelToken
const source = CancelToken.source()
// const baseProxy = 'CM/' // 数据请求代理地址 服务器
const baseProxy = 'api/' // 数据请求代理地址 本地
// const baseProxy = '/' // 数据请求代理地址 本地
/**
 * 创建axios实例
 * 基础url    是否允许携带token   配置请求时间
 * @type {AxiosInstance}
 */
const service = axios.create({
    // baseURL: process.env.NODE_ENV === 'production' ? 'http://119.45.133.245/' : '', //服务器地址
    baseURL: process.env.NODE_ENV === 'production' ? 'http://121.37.99.223:4003/' : '', //服务器地址
    withCredentials: true, // 允许携带 cookie
    timeout: 100000, // 请求超时时间
    transformRequest: [function (data, config) { // 在请求之前对data传参进行格式转换
        data = qs.stringify(data) // 请求参数序列化
        // 如果后台接收形式为json对象
        if (config['Content-Type'] === 'application/json;charset=UTF-8') {
            data = JSON.stringify(data)
        }
        return data
    }]
})

const service1 = axios.create({
    // baseURL: process.env.NODE_ENV === 'production' ? 'http://119.45.133.245/' : '', //服务器地址
    baseURL: process.env.NODE_ENV === 'production' ? 'http://121.37.99.223:4003' : '', //服务器地址
    withCredentials: true, // 允许携带 cookie
    timeout: 100000, // 请求超时时间
    transformRequest: [function (data, config) { // 在请求之前对data传参进行格式转换
        // data = qs.stringify(data) // 请求参数序列化
        // 如果后台接收形式为json对象
        if (config['Content-Type'] === 'application/json;charset=UTF-8') {
            data = JSON.stringify(data)
        }
        return data
    }]
})
// request拦截器   请求拦截器   可对请求参数信息做统一处理
service.interceptors.request.use(
    config => {
        // 在请求之前判断token是否存在 否=>请求阻止
        if (!getToken()) {
            if (typeof config.requireToken === 'undefined' || config.requireToken === true) {
                config.cancelToken = source.token // 阻止请求
            }
        }
        const token = store.getters.token
        token && (config.headers['accesstoken'] = token)
        // config.headers['Authorization'] = "Bearer "+ token
        // config.headers['accesstoken'] = token;
        return config
    },
    error => {
        Promise.reject(error)
    })

// respone拦截器   响应拦截器
service.interceptors.response.use(
    response => {
        return Promise.resolve(response)
    },
    error => {
        const errMsg = error.toString()
        const code = errMsg.substr(errMsg.indexOf('code') + 5)
        switch (code) {
            case '401':
                // MessageBox.confirm('登录过期请重新登录', '提示', {
                //   confirmButtonText: '确定',
                //   showClose: false,
                //   closeOnClickModal: false,
                //   showCancelButton: false
                // }).then(() => {
                //   store.dispatch('user/logOut') // 报错直接退出
                // })
                store.dispatch('user/logOut') // 报错直接退出
                break
            case '506':
                alert(error.response.data)
                break
            case '507':
                alert('sorry,您的IP已经被禁用,请联系管理员')
                break
            default:
                Message({
                    message: '服务器错误',
                    type: 'error',
                    duration: 5 * 1000
                })
                break
        }
        if (error.message.includes('timeout')) {
            Message({
                message: '请求超时，请检查网络连接',
                type: 'error',
                duration: 5 * 1000
            })
        }
        return Promise.reject(error)
    }
)
// post get 请求
const fetch = (method, url, data = {}, config) => {


    config = config || {}
    config.method = method
    config.url = baseProxy + url
    // data.token = store.getters.token // 全局token参数合并
    //
    if (url.indexOf("/score/score") > -1) {
        //后台提交json特殊处理
        config.headers = {'Content-Type': 'application/json;charset=UTF-8'}
        method.toLocaleLowerCase() === 'get' ? config['params'] = data : method.toLocaleLowerCase() === 'delete' ? config['params'] = data : config['data'] = data
        return service1(config).then(function (res) {
            return res.data
        })
    } else {
        method.toLocaleLowerCase() === 'get' ? config['params'] = data : method.toLocaleLowerCase() === 'delete' ? config['params'] = data : config['data'] = data
        return service(config).then(function (res) {
            return res.data
        })
    }

}

/**
 * @param url 请求地址
 * @param data 请求携带参数
 * @param config 额外配置项
 * @returns {*}
 */
const get = (url, data = {}, config) => {
    return fetch('get', url, data, config)
}

const post = (url, data = {}, config) => {
    return fetch('post', url, data, config)
}
const _delete = (url, data = {}, config) => {
    return fetch('delete', url, data, config)
}

export {get, post, _delete}
